#ifndef _Z_ESP_TCP_SERVER_H
#define _Z_ESP_TCP_SERVER_H

#include <stdint.h>
#include <stddef.h>
#include "esp_err.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief TCP 数据接收回调函数类型
 *
 * 当有客户端连接并发送数据时，会调用此回调函数。
 *
 * @param client_fd 客户端 socket 描述符
 * @param data 接收到的数据
 * @param len 数据长度
 * @param arg 用户自定义参数
 */
typedef void (*tcp_recv_callback_t)(int client_fd, const uint8_t *data, size_t len, void *arg);

/**
 * @brief 启动 TCP 服务器
 *
 * 仅需传入监听端口号和接收数据的回调函数（不需要时传 NULL），其余内部封装。
 *
 * @param port 监听端口号
 * @param recv_cb 数据接收回调函数
 * @param cb_arg 回调函数用户自定义参数
 * @return esp_err_t
 */
esp_err_t tcp_server_start(uint16_t port, tcp_recv_callback_t recv_cb, void *cb_arg);

/**
 * @brief 停止 TCP 服务器
 *
 * 关闭服务器 socket，并关闭所有已连接的客户端。
 *
 * @return esp_err_t
 */
esp_err_t tcp_server_stop(void);

/**
 * @brief 向指定客户端发送数据
 *
 * @param client_fd 客户端 socket 描述符（可在回调中获得）
 * @param data 要发送的数据
 * @param len 数据长度
 * @return esp_err_t
 */
esp_err_t tcp_server_send(int client_fd, const uint8_t *data, size_t len);

/**
 * @brief 向所有已连接的客户端广播数据
 *
 * @param data 要发送的数据
 * @param len 数据长度
 * @return esp_err_t
 */
esp_err_t tcp_server_broadcast(const uint8_t *data, size_t len);

int tcp_server_get_fd(void);

#ifdef __cplusplus
}
#endif

#endif /* _Z_ESP_TCP_SERVER_H */
